using System;
using System.Data;
using MySql.Data.MySqlClient;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.Generic;
using Novapangeia.Dominio;

namespace Novapangeia.Repositorio
{	
	public partial class RepositorioConstrucao
	{	   
		
		private ISqlHelper sqlHelper;
		
		public  RepositorioConstrucao(ISqlHelper _sqlHelper)
        {
            if (_sqlHelper == null)
                sqlHelper = new SqlHelper();
            else
                sqlHelper = _sqlHelper;
        }
		
		#region Parameters
		public static class Parameters
		{
			public static MySqlParameter Id
			{
				get
				{
					return new MySqlParameter("p_Id", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Usuario_id
			{
				get
				{
					return new MySqlParameter("p_Usuario_id", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Muralha
			{
				get
				{
					return new MySqlParameter("p_Muralha", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Mercado
			{
				get
				{
					return new MySqlParameter("p_Mercado", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Torres
			{
				get
				{
					return new MySqlParameter("p_Torres", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Armazem
			{
				get
				{
					return new MySqlParameter("p_Armazem", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Estabulo
			{
				get
				{
					return new MySqlParameter("p_Estabulo", MySqlDbType.Byte, 0);
				}
			}
			
			public static MySqlParameter Quartel
			{
				get
				{
					return new MySqlParameter("p_Quartel", MySqlDbType.Byte, 0);
				}
			}
            public static MySqlParameter Mina
            {
                get
                {
                    return new MySqlParameter("p_Mina", MySqlDbType.Byte, 0);
                }
            }
            public static MySqlParameter Serraria
            {
                get
                {
                    return new MySqlParameter("p_Serraria", MySqlDbType.Byte, 0);
                }
            }
            public static MySqlParameter Fazenda
            {
                get
                {
                    return new MySqlParameter("p_Fazenda", MySqlDbType.Byte, 0);
                }
            }
			
		}
		#endregion		
		
		//=================================================================
		//  Carrega todos os registros do banco de dados
		//=================================================================
		public List<Construcao> listarConstrucao() 
		{
			string sql = @"SELECT id, usuario_id, muralha, mercado, torres, armazem, estabulo, quartel, fazenda, mina, serraria FROM construcao";
					
			List<Construcao> entityList = new List<Construcao>();
			
			MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql);
			
			Construcao entity;
			
			while (reader.Read())
            {
                entity = preencherConstrucao(reader);
				entityList.Add(entity);
            }

            reader.Close();
			
			return entityList;
		}
	
		//=================================================================
		//  Carrega apenas um registro, buscado pela chave primária
		//=================================================================
		public Construcao ConsultarConstrucaoPorId(int Id)
		{
            string sql = @"SELECT
		                    id,
		                    usuario_id,
		                    muralha,
		                    mercado,
		                    torres,		                    
		                    armazem,
		                    estabulo,
		                    quartel		                    
	                    FROM construcao
	                    WHERE
		                    (id = @p_id)";
			MySqlParameter p;
			p = Parameters.Id;
			p.Value = Id;

            MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql, new MySqlParameter[] { p }, CommandBehavior.SingleRow);

		    Construcao entity = new Construcao();
			
			if(reader.HasRows)
            {
				reader.Read();
				entity = preencherConstrucao(reader);
            }
            else
            {
                entity = null;
            }

            reader.Close();
			
			return entity;
		}
		
        private Construcao preencherConstrucao(MySqlDataReader  reader)
        {
            Construcao construcao = new Construcao();
            construcao.Id = reader.GetInt32("Id");
            construcao.Usuario_id = reader.GetInt32("Usuario_id");
            construcao.Muralha = reader.GetInt32("Muralha");
            construcao.Mercado = reader.GetInt32("Mercado");
            construcao.Torres = reader.GetInt32("Torres");
            construcao.Armazem = reader.GetInt32("Armazem");
            construcao.Estabulo = reader.GetBoolean("Estabulo");
            construcao.Quartel = reader.GetBoolean("Quartel");
            construcao.Fazenda = reader.GetInt32("Fazenda");
            construcao.Mina = reader.GetInt32("Mina");
            construcao.Serraria = reader.GetInt32("Serraria");
            return construcao;
        }
	
		public void cadastrarConstrucao(Construcao construcao)
		{
            string sql = @"INSERT
	                        INTO construcao
	                        (
		                        usuario_id,
		                        muralha,
		                        mercado,
		                        torres,		                        
		                        armazem,
		                        estabulo,
		                        quartel,
                                fazenda,
                                mina,
                                serraria		                        
	                        )
	                        VALUES
	                        (
		                        @p_usuario_id,
		                        @p_muralha,
		                        @p_mercado,
		                        @p_torres,
		                        @p_armazem,
		                        @p_estabulo,
		                        @p_quartel,
                                @p_fazenda,
                                @p_mina,
                                @p_serraria		                        
	                        )";

			List<MySqlParameter> parametros = new List<MySqlParameter>();
			
			MySqlParameter p;
			
			p = Parameters.Id;
			p.Direction = ParameterDirection.Output;
			parametros.Add(p);

			p = Parameters.Usuario_id;
			p.Value = construcao.Usuario_id;
			parametros.Add(p);

			p = Parameters.Muralha;
			p.Value = construcao.Muralha;
			parametros.Add(p);

			p = Parameters.Mercado;
			p.Value = construcao.Mercado;
			parametros.Add(p);

			p = Parameters.Torres;
			p.Value = construcao.Torres;
			parametros.Add(p);

			p = Parameters.Armazem;
			p.Value = construcao.Armazem;
			parametros.Add(p);

			p = Parameters.Estabulo;
			p.Value = construcao.Estabulo;
			parametros.Add(p);

			p = Parameters.Quartel;
			p.Value = construcao.Quartel;
            parametros.Add(p);

            p = Parameters.Fazenda;
            p.Value = construcao.Fazenda;
            parametros.Add(p);

            p = Parameters.Mina;
            p.Value = construcao.Mina;
            parametros.Add(p);

            p = Parameters.Serraria;
            p.Value = construcao.Serraria;
            parametros.Add(p);

            sqlHelper.ExecuteSql(CommandType.Text, sql, parametros.ToArray());
		}
	
		public bool atualizarConstrucao(Construcao construcao)
		{
            string sql = @"UPDATE construcao
	                        SET
		                        usuario_id = @p_usuario_id,
		                        muralha = @p_muralha,
		                        mercado = @p_mercado,
		                        torres = @p_torres,
		                        armazem = @p_armazem,
		                        estabulo = @p_estabulo,
		                        quartel = @p_quartel,
                                fazenda = @p_fazenda,
                                mina = @p_mina,
                                serraria = @p_serraria
	                        WHERE
		                        id = @p_id";

			List<MySqlParameter> parametros = new List<MySqlParameter>();
			
			MySqlParameter p;
			
			p = Parameters.Id;
			p.Value = construcao.Id;
			parametros.Add(p);

			p = Parameters.Usuario_id;
			p.Value = construcao.Usuario_id;
			parametros.Add(p);

			p = Parameters.Muralha;
			p.Value = construcao.Muralha;
			parametros.Add(p);

			p = Parameters.Mercado;
			p.Value = construcao.Mercado;
			parametros.Add(p);

			p = Parameters.Torres;
			p.Value = construcao.Torres;
			parametros.Add(p);

			p = Parameters.Armazem;
			p.Value = construcao.Armazem;
			parametros.Add(p);

			p = Parameters.Estabulo;
			p.Value = construcao.Estabulo;
			parametros.Add(p);

			p = Parameters.Quartel;
			p.Value = construcao.Quartel;
			parametros.Add(p);

            p = Parameters.Fazenda;
            p.Value = construcao.Fazenda;
            parametros.Add(p);

            p = Parameters.Mina;
            p.Value = construcao.Mina;
            parametros.Add(p);

            p = Parameters.Serraria;
            p.Value = construcao.Serraria;
            parametros.Add(p);

            return sqlHelper.ExecuteSql(CommandType.Text, sql, parametros.ToArray());	
		}

        public Construcao ConsultarConstrucaoPorUsuarioId(int idUsuario)
        {
            string sql = @"SELECT
		                    id,
		                    usuario_id,
		                    muralha,
		                    mercado,
		                    torres,		                    
		                    armazem,
		                    estabulo,
		                    quartel,
                            fazenda,
                            mina,
                            serraria		                    
	                    FROM construcao
	                    WHERE
		                    (usuario_id = @p_Usuario_id)";

            MySqlParameter p;
            p = Parameters.Usuario_id;
            p.Value = idUsuario;

            MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql, new MySqlParameter[] { p }, CommandBehavior.SingleRow);

            Construcao entity = new Construcao();

            if (reader.HasRows)
            {
                reader.Read();
                entity = preencherConstrucao(reader);
            }
            else
            {
                entity = null;
            }

            reader.Close();

            return entity;
        }
    }
}
